#ifndef _P2P_UI_TEST_H_
#define _P2P_UI_TEST_H_

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
#include <pthread.h>

#define	P2P_AUTO	1
//#define DHCP	1
#define CMD_SZ 100
#define SSID_SZ	32

#define SEC 1000000
#define SCAN_POOL_NO	8
#define NEGO_RETRY_INTERVAL 10 * SEC
#define NEGO_QUERY_INTERVAL 0.5 * SEC
#define PRE_NEGO_INTERVAL 0.5 * SEC
#define MAX_PROV_RETRY 15
#define PROV_RETRY_INTERVAL 5
#define PROV_WAIT_TIME	1 * SEC
#define MAX_NEGO_RETRY 60
#define NEGO_WAIT_TIME	0.5 * SEC
#define	WPS_RETRY 120
#define SUPPLICANT_INIT_TIME 1 * SEC
#define HOSTAPD_INIT_TIME	1 * SEC
#define SUPPLICANT_INTERVAL 1 * SEC
#define HOSTAPD_INTERVAL 1 * SEC
#define POLLING_INTERVAL	1 * SEC
#define _TRUE 1
#define _FALSE 0

#define WPS_CONFIG_METHOD_LABEL		0x0004
#define WPS_CONFIG_METHOD_DISPLAY	0x0008
#define WPS_CONFIG_METHOD_E_NFC		0x0010
#define WPS_CONFIG_METHOD_I_NFC		0x0020
#define WPS_CONFIG_METHOD_NFC		0x0040
#define WPS_CONFIG_METHOD_PBC		0x0080
#define WPS_CONFIG_METHOD_KEYPAD	0x0100
#define WPS_CONFIG_METHOD_VPBC		0x0280
#define WPS_CONFIG_METHOD_PPBC		0x0480
#define WPS_CONFIG_METHOD_VDISPLAY	0x2008
#define WPS_CONFIG_METHOD_PDISPLAY	0x4008

enum thread_trigger{
	THREAD_NONE = 0,
	THREAD_DEVICE = 1,
	THREAD_GO = 2,
};

enum P2P_ROLE {
	P2P_ROLE_DISABLE = 0,
	P2P_ROLE_DEVICE = 1,
	P2P_ROLE_CLIENT = 2,
	P2P_ROLE_GO = 3	
};

enum P2P_STATE {
	P2P_STATE_NONE = 0,					//	P2P disable
	P2P_STATE_IDLE = 1,						//	P2P had enabled and do nothing
	P2P_STATE_LISTEN = 2,					//	In pure listen state
	P2P_STATE_SCAN = 3,					//	In scan phase
	P2P_STATE_FIND_PHASE_LISTEN = 4,		//	In the listen state of find phase
	P2P_STATE_FIND_PHASE_SEARCH = 5,		//	In the search state of find phase
	P2P_STATE_TX_PROVISION_DIS_REQ = 6,	//	In P2P provisioning discovery
	P2P_STATE_RX_PROVISION_DIS_RSP = 7,
	P2P_STATE_RX_PROVISION_DIS_REQ = 8,	
	P2P_STATE_GONEGO_ING = 9,				//	Doing the group owner negoitation handshake
	P2P_STATE_GONEGO_OK = 10,				//	finish the group negoitation handshake with success
	P2P_STATE_GONEGO_FAIL = 11,			//	finish the group negoitation handshake with failure
	P2P_STATE_RECV_INVITE_REQ = 12,		//	receiving the P2P Inviation request
	P2P_STATE_PROVISIONING_ING = 13,		//	Doing the P2P WPS
	P2P_STATE_PROVISIONING_DONE = 14,	//	Finish the P2P WPS
};

enum P2P_WPSINFO {
	P2P_NO_WPSINFO						= 0,
	P2P_GOT_WPSINFO_PEER_DISPLAY_PIN	= 1,
	P2P_GOT_WPSINFO_SELF_DISPLAY_PIN	= 2,
	P2P_GOT_WPSINFO_PBC					= 3,
};

struct scan{
	char addr[18];
	int go;
};

struct p2p{
	char ifname[10];
	int enable;
	int status;
	char dev_name[33];
	int intent;
	int listen_ch;
	int wps_info;
	int wpsing;
	unsigned int pin;
	int role;
	char peer_devaddr[18];
	int p2p_get;	//p2p_get==1 : print messages from ioctl p2p_get
	char print_line[CMD_SZ];
	int have_p2p_dev;	//have_p2p_dev==1 : after scanning p2p device
	int show_scan_result;
	int	count_line;
	char peer_ifaddr[18];
	char cmd[CMD_SZ];
	char parse[CMD_SZ];
	char apd_ssid[SSID_SZ];
	int op_ch;	//operation channel
	int wpa_open;
	int ap_open;
	char ap_conf[CMD_SZ];
	char ap_path[CMD_SZ];
	char apcli_path[CMD_SZ];
	char wpa_conf[CMD_SZ];
	char wpa_path[CMD_SZ];
	char wpacli_path[CMD_SZ];
	char ok_msg[CMD_SZ];
	char redo_msg[CMD_SZ];
	char fail_msg[CMD_SZ];
	char nego_msg[CMD_SZ];
	char scan_msg[CMD_SZ];
	int thread_trigger;
	pthread_t pthread;
	pthread_t pthread_go;
	int res;	//check if thread is created; 1: disabled, 0: enabled
	int res_go;	//created if p2p device becomes GO
	struct scan scan_pool[SCAN_POOL_NO];
	int connect_go;
	int no_sta_connected;
};

void ui_screen(struct p2p *p);
char *naming_wpsinfo(int wps_info);
char *naming_role(int role);
char *naming_status(int status);
unsigned int wps_pin_checksum(unsigned int pin);
void p2p_enable(struct p2p *p);
void p2p_scan(struct p2p *p);
void scan_result(struct p2p *p);
void p2p_intent(struct p2p *p);
void p2p_pincode(struct p2p *p, char *ins_no, char *ins_no_again);
void p2p_devaddr(struct p2p *p);
void p2p_role(struct p2p *p, int flag);
void p2p_status(struct p2p *p, int flag);
void p2p_prov_disc_no_addr(struct p2p *p, char *msg);
void p2p_prov_disc(struct p2p *p, char *msg, char *dis_msg, char *label_msg);
void p2p_set_nego(struct p2p *p);
void p2p_ifaddr(struct p2p *p);
void p2p_client_mode(struct p2p *p);
void p2p_go_mode(struct p2p *p);
void p2p_get_hostapd_conf(struct p2p *p);
void p2p_set_opch(struct p2p *p, char *msg, int print);
void p2p_softap_ssid(struct p2p *p, char *msg, int print);
void p2p_listen_ch(struct p2p *p, char *msg);
void p2p_peer_devaddr(struct p2p *p, char *peer_devaddr);
void p2p_peer_req_cm(struct p2p *p, char *peer_req_cm);
void p2p_peer_info(struct p2p *p, char *peer_devaddr, char *peer_req_cm);
void p2p_wps_cm(struct p2p *p, char *scan_addr, char *cms);
void p2p_device_name(struct p2p *p, char *scan_addr, char *dns);
void p2p_setDN(struct p2p *p);
void *polling_status(void *arg);
void *polling_client(void *arg);
void *print_status(void *arg);

#endif	//_P2P_UI_TEST_H_
